<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0046)http://www.vovisoft.com/dotNET/Bai02/Bai02.htm -->
<HTML><HEAD><TITLE>.NET Lesson 02</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META http-equiv=Content-Language content=vi>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="Visual Basic, VB Programming in Vietnamese, Vovisoft, VB6, VB Tutorials, Learn Visual Basic, Internet, Unicode, Vietnamese VB tutorials, Database, Asp, Java, Javascript, VBscript, FrontPage 2000, XML, Ms Office 2000" 
name=keywords></HEAD>
<BODY leftMargin=0 topMargin=0 marginheight="0" marginwidth="0">
<CENTER><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="Bai 2_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma>
<H2><FONT face=Tahoma color=#800000>Bài 2</FONT></H2>
<H2><FONT face=Tahoma color=#800000>Visual Studio.NET</FONT></H2></CENTER>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <H3>Visual Studio.NET</H3>Để chạy VisualStudio.NET bạn cần phải Set Time của 
    Windows lại trước cuối tháng 7,2001, eg: 1-July-2001.<BR><BR>Visual 
    Studio.NET Beta 2 hiện nay có Service Pak 2, nó cho phép ta dùng Visual 
    Studio.NET Beta 2 sau ngày 31-July-2001, tức là không có time-bomb. Nếu 
    VS.NET version của bạn bị giới hạn về thời gian nói trên, từ trong VS.NET 
    bạn có thể download Service Pak 2 để cài đặt bằng cách dùng IDE Menu Command 
    <B>Help | Check for Updates</B>.<BR><BR>Có hai cách để bắt đầu một project 
    mới trong VS.NET. Hoặc Click <B>New Project</B> trong trang Web 
    <B>StartPage</B> như dưới đây:<BR><BR><IMG height=293 
    src="Bai 2_files/StartPage.gif" width=591><BR><BR><BR><BR>Hoặc dùng Menu 
    command <B>File | New | Project</B> giống như trong VB6 IDE:<BR><BR><IMG 
    height=409 src="Bai 2_files/NewProject.gif" width=373><BR><BR><BR><BR>Khi 
    <B>Add New Project</B>, <B>Name</B> sẽ là subfolder name của New Project. 
    Bạn có thể chọn VB.NET, C# hay VC++.NET project. Trong tương lai chúng ta sẽ 
    chỉ nhắm vào VB.NET và C# thôi. Ngoài ra SetUp and Deployment bây giờ là một 
    loại project nằm trong IDE của Visual Studio.NET, ta không cần phải chạy 
    riêng chương trình Package and Deployment bên ngoài VB6 IDE như trước 
    đây.<BR><BR><B>Solution</B> trong VS.NET có thể chứa hơn một Project và bao 
    gồm tất cả những files bạn liệt ra là cần thiết cho Solution. Nếu một trong 
    những files ấy bị thay đổi bên ngoài VS.NET, khi VS.NET khám phá ra nó sẽ 
    load vào trong VS.NET cho bạn nếu bạn đồng ý.<BR><BR><IMG height=390 
    src="Bai 2_files/AddNewProject.gif" width=619><BR><BR><BR><BR>Để mở một 
    Solution/Project có sẵn, bạn có thể click <B>link</B> của tên project trên 
    trang <B>StartPage</B>, hay dùng Menu command <B>File | Open | Project </B>, 
    hay Menu Command <B>File | Recent Projects</B>. 
    <H3>Visual Studio.NET IDE</H3><IMG height=640 src="Bai 2_files/NETVBIDE.gif" 
    width=764><BR><BR><BR><BR>Giao diện của VS.NET có những đặc điểm giống như 
    Delphi và Visual InterDev ở chỗ code được generated tự động, Windows nằm 
    chung thành Tab set hay float khắp nơi, và hổ trợ Solution rất thích hợp cho 
    việc triển khai của cả đội.<BR><B>Toolbox</B> bên trái chứa Controls cho 
    <B>Windows Forms, Web Forms, General Components, Data Components, HTML tags, 
    XML Schema tools</B> v.v... Khi một Form đang hiển thị, click lên một button 
    trong Toolbox để chọn Tool Set bạn cần. Toolbox ở trạng thái <B>Fixed 
    displayed</B> (như trong hình trên) khi cây ghim phía trên đâm xuống. Bạn có 
    thể click cây ghim cho nó nằm ngang và vertical Toolbox tab hiện ra bên 
    trái. Lúc ấy, Toolbox ở trong trạng thái <B>Auto Hide</B> (hiện ra/rút vào) 
    như dưới đây:<BR><BR><IMG height=155 src="Bai 2_files/Autohide.gif" 
    width=166><BR><BR>Bạn có thể gọi hầu hết các Windows hiển thị bằng cách dùng 
    Menu commands <B>View</B>, <B>View | Other Windows</B> và <B>Debug | 
    Windows</B>:<BR><BR><IMG height=467 src="Bai 2_files/ViewMenu.gif" 
    width=213><BR><BR>Các Windows bên phải có thể float, nằm chồng lên nhau 
    thành những Tabs trong một Window set hay nằm cạnh nhau vertically tiled. 
    Nắm Tittle bar để dời nguyên một Window set đi. Nắm Window Tab của một 
    Window set để kéo chỉ một Window ra. Bạn có thể để chồng hai Windows lại với 
    nhau bằng cách nắm Tittle bar của một Window để chồng lên một Window khác. 
    Thử nhích đi, nhích lại, trước khi buông Window ra để làm quen với kết 
    quả.<BR><BR>Phía dưới có <B>Task List Window</B> để bạn giữ sổ sách về diễn 
    tiến của dự án và quản lý cả đội. Khi bạn dùng menu command <B>Build | 
    Build</B> để compile program, nếu có errors chúng sẽ được hiển thị trong 
    Task List Window. Double click lên một hàng error để mang cursor đến chỗ gây 
    ra error ấy trong code window.<BR>Trong hình dưới đây, ta cố ý comment out 
    hàng <B>Dim sw As StreamWriter</B>:<BR><BR><IMG height=352 
    src="Bai 2_files/TaskList.gif" width=655><BR><BR>Ngoài ra, để Debug bây giờ 
    bạn có <B>Output Window</B> để in ra các messages mà trong VB6 bạn dùng 
    Immediate Window. Thí dụ trong VB6 bạn 
    viết:<BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>Debug.Print "Count=" &amp; 
    CStr(Count)</B><BR>để in ra trong Immediate Window, thì trong VB.NET bạn có 
    thể viết:<BR>&nbsp;&nbsp;&nbsp;&nbsp;<B> Console.WriteLine("Count= {0}", 
    Count)</B><BR>để in ra trong Output Window.<BR><BR>Dĩ nhiên bạn vẫn có thể 
    tiếp tục dùng Immediate Window trong công tác Debug như trước đây trong 
    VB6.<BR><BR>Chưa hết, VS.NET còn cho bạn <B>Command Window</B> để ta có thể 
    enter những VS.NET commands để manipulate IDE, xử lý macros, .v.v<BR>Để hiển 
    thị Window nầy bạn dùng menu command <B>View | Other Windows | Command 
    Window</B>. Để tiện hơn, bạn drag title bar của nó để chồng lên tab bar của 
    Task List và Output windows.<BR><BR><IMG height=203 
    src="Bai 2_files/CommandWindow.gif" width=569><BR><BR>Nếu ta enter một 
    command như:<BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>File.AddNewProject</B><BR>IDE sẽ 
    hiển thị <B>Add New Project</B> dialog.<BR><BR>VS.NET hổ trợ <B>Macro</B> để 
    bạn có thể <B>record</B> và <B>playback</B> một chuổi công tác.<BR>Phương 
    tiện <B>Integrated Debugging</B> cho ta <B>Debug Menu, Call Stack Window, 
    Breakpoints Window</B> và <B>Watch and Value Display 
    Windows</B>.<BR><BR>Thường thường bạn sẽ Add Reference các <B>.NET</B> 
    components. Nhưng bạn cũng có thể dùng <B>ActiveX</B> (có sẵn trong VB6) 
    trong .NET application bằng cách Add Reference <B>COM</B> (click Tab COM 
    trên Add Reference Dialog). .NET sẽ gói ActiveX thành một NET component 
    (click <B>Yes</B> trả lời câu hỏi "Would you like to have a wrapper 
    generated for you?"). Ngoài ra dùng Add Reference <B>Projects</B> để refer 
    đến DLL của các User developed DLL.<BR><BR><IMG height=623 
    src="Bai 2_files/AddReference.gif" width=659><BR><BR>
    <H3>Demo Program</H3>Trong chương trình biểu diễn nầy, ta dùng giao diện hầu 
    như hoàn toàn bằng chữ Việt. Ta có thể đánh chữ Việt (<B>Unicode</B>) cho 
    Title Bar, Menu, TextBox, ListBox .v.v.. <BR>Nếu bạn cần một key input 
    software cho chữ Việt hổ trợ Unicode thì download <B>VPS, Vietkey</B> hay 
    <B>Unikey</B>. <BR>Các documents như Form, XML .v.v. trong .NET project đều 
    được Saved với <B>UTF-8 encoding</B>. Bạn có thể <A 
    href="http://www.vovisoft.com/dotNET/Bai02/NETListbox.zip">Download source 
    code</A> của program demo nầy tại đây.<BR><BR>Trong program <B>Sở thú 
    Saigon</B> nầy ta có hai Listboxes. Khi chạy, bạn có thể drag tên các loại 
    thú từ Listbox1 (bên trái) để drop vào Listbox2 (bên phải). Phía dưới là một 
    Label dùng để hiển thị ngày giờ. Có một button <B>Lưu trử danh sách</B> để 
    ta save data trong Listbox2 vào file <B>animal.txt</B> trong subFolder 
    <B>bin</B>. Ngoài ra bạn cũng có thể dùng Main menu Item <B>Đọc danh 
    sách</B> để Load data từ file animal.txt vào Listbox2.<BR><BR><IMG 
    height=255 src="Bai 2_files/docdanhsach.gif" width=456><BR><BR><BR><BR>Những 
    components không cần phải hiện ra lúc runtime như <B>Timer, Menu, 
    Tooltip</B> .v.v. nằm trong một Component Tray (mâm) riêng. Muốn Edit 
    MainMenu, click lên MainMenu1 icon rồi đánh trực tiếp vào MainMenu. Thêm các 
    menuitems mới bằng cách đánh thẳng vào các chỗ có chữ <B>Type Here</B>. Lưu 
    ý các Tabs bên trên Editing Area khi bạn mở nhiều forms.<BR><BR><IMG 
    height=210 src="Bai 2_files/Typehere.gif" width=321> &nbsp;&nbsp;<IMG 
    height=399 src="Bai 2_files/Form1Design.gif" width=498><BR><BR>Edit 
    MainMenu, insert một <B>Separator</B><BR><BR><IMG height=364 
    src="Bai 2_files/MainMenu.gif" width=454><BR><BR><BR><BR>Chú ý danh sách các 
    <B>References</B> được liệt kê trong <B>Solution Explorer</B>.<BR><BR><IMG 
    height=259 src="Bai 2_files/References.gif" width=274><BR><BR><BR><BR>Edit 
    Shortcut cho một menu item.<BR><BR><IMG height=381 
    src="Bai 2_files/Shortcut.gif" width=694><BR><BR><BR><BR>Button bây giờ 
    chẳng những có thể chứa hình mà còn cho bạn chọn vị trí của hình trong 
    button bằng <B>ImageAlign</B> nữa.<BR><BR><IMG height=289 
    src="Bai 2_files/ImageAlign.gif" width=839><BR><BR><BR><BR>Bạn có thể 
    <B>Anchor</B> một Button để nó dính vào một góc của form để khi form resizes 
    thì Button chạy theo góc ấy của form. Ở đây ta click hai thanh <B>Dưới</B> 
    và <B>Phải</B> cho chúng trở nên màu đen để chọn Anchor <B>Bottom</B> và 
    <B>Right</B>.<BR><BR><IMG height=362 src="Bai 2_files/Anchor.gif" 
    width=834><BR><BR><BR><BR>Trong lúc thiết kế ta có thể edit các List items 
    của một Listbox bằng cách mở property <B>Items Collection</B> ra và Edit vào 
    một trang.<BR><BR><IMG height=372 src="Bai 2_files/ListboxItems.gif" 
    width=753><BR><BR><BR><BR>
    <H3>Walk Through Code</H3>Trong .NET, các classes được chia ra thành nhiều 
    nhóm như System.IO, System.XML, System.Data, System.Drawing ..v.v..<BR>Ngoài 
    ra trong mỗi nhóm lại còn chia thành những nhóm con, cháu như 
    System.Windows.Forms, System.Windows.Collections, 
    System.Windows.Diagnostics, .v.v.. Mặc dầu một khi đã <B>Project | Add 
    Reference</B> các .NET components ấy ta có thể dùng chúng trong program 
    nhưng vẫn phải biên một tên dài như <B>System.IO.StreamReader</B> để tránh 
    lẫn lộn. Để có thể viết tên class gọn hơn ta dùng <B>Imports</B> như 
    <B>Imports System.IO</B>, sau đó ta chỉ cần viết <B>StreamReader</B> là đủ. 
    Công việc Imports nầy được gọi là importing <B>Namespace</B> (của 
    System.IO). <BR><BR>Tương tự như thế, để có thể tiếp tục dùng các Functions 
    <B>Left, Right, Mid</B> của VB6 trong .NET ta có thể thêm câu <B>Imports VB6 
    = Microsoft.VisualBasic</B> ở đầu chương trình. Sau đó ta có thể 
    viết:<BR><BR>&nbsp;&nbsp;&nbsp;AppPath = VB6.Left(AppPath, 
    Pos)<BR><BR>Nguyên program chúng ta tại đây là <B>Public Class Form1</B>. 
    Form1 thừa kế standard form class của .NET Framework nên ta 
    declare:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>Inherits 
    System.Windows.Forms.Form</B><BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Imports</FONT> System.IO 
<FONT color=blue>Imports</FONT> VB6 = Microsoft.VisualBasic 
<FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> Form1 
Inherits System.Windows.Forms.Form 
<FONT color=blue>Dim</FONT> AppPath <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> <BR>
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> MenuItem4_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> MenuItem4.Click 
   <FONT color=blue>End</FONT>  <FONT color=green>' Terminate the program</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> <BR>
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Form1_Load(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> MyBase.Load 
   <FONT color=green>' Obtain the folder where this program EXE resides and initialise tooltip</FONT>
   <FONT color=blue>Dim</FONT> AppPath <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Dim</FONT> Pos <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=green>' Fetch full pathname of the EXE file</FONT>
   AppPath = System.Reflection.Assembly.GetExecutingAssembly.Location 
   <FONT color=green>' Locate the last slash in the pathname string</FONT>
   Pos = InStrRev(AppPath, "/") 
   <FONT color=green>' Extract the part up to the backslash</FONT>
   AppPath = VB6.Left(AppPath, Pos) 
   <FONT color=green>' Initialise the tooltip for Listbox1</FONT>
   ToolTip1.SetToolTip(ListBox1, "Xin nắm kéo tên một con thú qua Listbox bên phải") 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE>Hãy xem cách viết một Event Handler 
    như:<BR><B>Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal 
    e As System.EventArgs) Handles MenuItem4.Click</B><BR>Khác với VB6, nó có 
    thêm các chữ <B>Handles MenuItem4.Click</B> ở phía cuối để nói handling 
    event <B>Click</B> của <B>MenuItem4</B>. Mọi Event Handler đều được passed 
    cho hai parameters: <B>ByVal sender As System.Object</B> và <B>ByVal e As 
    System.EventArgs</B>. Parameter thứ nhất, <B>sender</B>, là Object chủ động 
    chuyện RaiseEvent, còn <B>e</B> là Event có chứa nhiều dữ kiện khác nhau tùy 
    theo tình huống. Khi edit code bạn có thể nhờ Intellisense của IDE giúp đỡ 
    cho biết parameter <B>e</B> chứa những dữ kiện gì.<BR><BR>Trong .NET, vấn đề 
    handling event không phải là một điều bí hiểm như trong VB6. Khi một control 
    có thể RaiseEvent thì chẳng những một, mà <B>nhiều</B> controls khác đều có 
    thể <B>Đăng ký (Register)</B> để được <B>Thông báo (Notified)</B> khi Event 
    ấy xãy ra.<BR>Control RaiseEvent được gọi là <B>Publisher</B> (Nhà Xuất 
    Bản), các controls muốn handle event được gọi là <B>Subcribers</B> (những 
    Người Đặt Mua dài hạn) . Dĩ nhiên cách handle event của mỗi control đều khác 
    nhau, dầu rằng được passed cho cùng hai parameters. Các EventHandlers nầy 
    được gọi là <B>Delegates</B> (những Nhà Đại Diện lãnh trách nhiệm giải quyết 
    một sự cố).<BR><BR>Do đó, ta có thể dùng vỏn vẹn một EventHandler để handle 
    nhiều Event khác nhau, xuất phát từ nhiều Objects. Nói cho đơn giản ra, sau 
    khi ta đã đăng ký một hay nhiều Delegates (tức là EventHandler Subs), thì 
    khi Event xảy ra, các EventHandler Subs ấy sẽ được xử lý. <BR>Nếu bạn vẫn 
    còn thấy khó hiểu thì hãy đọc thí dụ nầy. Tưởng tượng bạn làm biếng nấu ăn 
    nên đặt nhà hàng giao cơm mỗi ngày đến tận nhà. Có hai cách để bạn nhận 
    "gà-mên" cơm:<BR>
    <OL>
      <LI>Người giao cơm sẽ để "gà-mên" cơm trước nhà, cạnh bên hộp thư. Khi đi 
      làm về, bạn sẽ mang nó vô nhà. Trong trường hợp nầy bạn xử lý công việc 
      khi nào tiện, tức là lúc về đến nhà. Cách nầy có điểm bất lợi là hôm nào 
      bạn đi làm về trể thì cơm có thể bị thiêu vì trời nóng. 
      <LI>Bạn đưa chìa khóa nhà cho người giao cơm giữ. Khi giao cơm, người ấy 
      sẽ tự động mở cửa vô nhà để "gà-mên" thẳng vào trong tủ lạnh. Trong cách 
      nầy <B>Event GiaoCơm</B> được handled bằng EventHandler <B>Sub 
      OpenDoorPutIntoFridge</B>, do người giao cơm xử lý, chớ không phải chính 
      bạn.<BR>Như thế, là Subscriber (người ăn cơm tháng giao tận nhà) bạn 
      register EventHandler "Sub OpenDoorPutIntoFridge" với người giao cơm qua 
      việc đưa chìa khóa. Khi Event "GiaoCơm" xãy ra, người giao cơm tự động 
      executes Sub OpenDoorPutIntoFridge. Kỹ thuật giao <B>AddressOf</B> Sub cho 
      một Object khác để nó execute khi cần còn có tên là 
      <B>CallBack</B>.<BR><BR></LI></OL>Do đó, ngay cả trong lúc runtime (không 
    phải khi design), để Register EventHandler <B>Sub MenuItem4_Click</B> với 
    system để handle Event Click của MenuItem4 ta có thể execute 
    code:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>AddHandler MenuItem4.Click, 
    AddressOf MenuItem4_Click</B><BR><BR>Lưu ý cách ta dùng control ToolTip1 để 
    register Tooltip Text với Listbox1. Ta có thể dùng chỉ một control ToopTip1 
    để register nhiều Tooltip Texts với những controls khác nhau như TextBox, 
    ComboBox .v.v..<BR><BR>Bạn có thể thay thế 
    hàng:<BR>&nbsp;&nbsp;&nbsp;<B>AppPath = VB6.Left(AppPath, Pos) 
    </B><BR>bằng<BR>&nbsp;&nbsp;&nbsp;<B>AppPath = AppPath.SubString(0,Pos)</B> 
    <BR><BR>Trong VB6, Visual components của một form được chứa dưới dạng Text 
    diễn tả các controls rất dễ đọc ở ngay đầu form file, nhưng nó không phải là 
    VB6 code.<BR>Trong .NET, Visual components của một form được chứa dưới dạng 
    code thật sự. Tức là, nếu không có VS.NET ta có thể dùng Notepad viết code 
    như thế và sau khi compile, nó vẫn chạy y hệt như trong trường hợp ta dùng 
    VS.NET. Điểm nầy giống như trong Java, ta có thể viết code bằng Notepad và 
    dùng Command line để compile và link code file với các components 
    khác.<BR><BR>Thí dụ như khi ta viết một VB.NET program đơn giản để chạy trên 
    trong DOS Console, ta có thể compile nó như 
    sau:<BR><BR>&nbsp;&nbsp;&nbsp;<B>vbc /t:exe /r:system.dll 
    mysource.vb</B><BR><BR><B>vbc</B> là VisualBasic Compiler, <B>/t:</B> có 
    nghĩa <B>target</B> tức là EXE để chạy trong DOS console. <B>/r:</B> có 
    nghĩa <B>reference</B> đến DLL.<BR>Nếu muốn chạy trong Windows, ta 
    dùng:<BR>&nbsp;&nbsp;&nbsp;<B>vbc /t:winexe /r:system.dll 
    /r:system.windows.forms.dll mysource.vb</B><BR><BR>Bình thường generated 
    code được dấu trong <B>Region</B> để khỏi choán chỗ, hay khêu gợi chúng ta 
    sửa đổi.<BR>Click dấu <B>+</B> bên lề trái để mở một <B>Region</B> hay 
    <B>Sub/Function</B>. Click dấu <B>-</B> để đóng lại.<BR>Đôi khi ta cũng có 
    thể Edit generated code, nhưng bạn nhớ backup code trước, để rủi form không 
    thể hiển thị vì bị error, chỉ cho ta một trang giấy trắng, thì ta còn có 
    đường restore.<BR><BR><IMG height=443 
    src="Bai 2_files/WindowFormGenCode.gif" width=622><BR><BR><BR><BR>Mỗi class 
    đều có ít nhất một <B>Sub New</B>, gọi là <B>Constructor</B> (giống như 
    <B>Class_Initialize</B> của VB6 class) và <B>Sub Dispose</B>, gọi là 
    <B>Destructor</B>. Đó là hai Sub dùng để tạo ra và phá hủy Object. Vì Form1 
    thừa kế từ Standard Form nên trong Sub New <B>trước hết</B> phải gọi 
    constructor <B>MyBase.New()</B> của cha nó, và trong Sub Dispose <B>sau 
    hết</B> phải gọi destructor <B>MyBase.Dispose</B> của cha nó.<BR><BR>Mở 
    Class View Window<BR><BR><IMG height=343 src="Bai 2_files/ClassView.gif" 
    width=293><BR><BR><BR><BR>Bạn có thể Navigate trong Code qua Class View. 
    DoubleClick lên tên của Object hay Sub/Function trong Class View để mang 
    cursor đến code của nó trong trang Edit.<BR><BR><IMG height=341 
    src="Bai 2_files/NavigateClassView.gif" width=875><BR><BR><BR><BR>
    <H3>Biểu diển DragDrop</H3><IMG height=260 src="Bai 2_files/dragdrop.gif" 
    width=456><BR><BR>Code của DragDrop, lưu ý ta phải viết thêm <B>Sub 
    ListBox2_DragEnter</B> để handle Event DragEnter.<BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> ListBox1_MouseDown(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.Windows.Forms.MouseEventArgs) <FONT color=blue>Handles</FONT> ListBox1.MouseDown 
   <FONT color=green>' Start the DragDrop process</FONT>
   <FONT color=blue>Dim</FONT> ItemIndex <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=green>' Identify the Listbox item that has mousedown using mouse coordinates</FONT>
   ItemIndex = ListBox1.IndexFromPoint(New System.Drawing.Point(e.X, e.Y)) 
   <FONT color=green>' Start the DragDrop process passing along the ListboxItem as ListBox1.Items(ItemIndex)</FONT>
   ListBox1.DoDragDrop(ListBox1.Items(ItemIndex), DragDropEffects.Copy <FONT color=blue>Or</FONT> DragDropEffects.Move) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT><BR> 
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> ListBox2_DragEnter(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.Windows.Forms.DragEventArgs) <FONT color=blue>Handles</FONT> ListBox2.DragEnter 
   <FONT color=green>' Apply the copy effect</FONT>
   <FONT color=green>' AND remember to set the property Allow Drop of Listbox2 to TRUE</FONT>
   <FONT color=blue>If</FONT> (e.Data.GetDataPresent(DataFormats.Text)) <FONT color=blue>Then</FONT> 
      e.Effect = DragDropEffects.Copy 
   <FONT color=blue>Else</FONT> 
      e.Effect = DragDropEffects.None 
   <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT><BR> 
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> ListBox2_DragDrop(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.Windows.Forms.DragEventArgs) <FONT color=blue>Handles</FONT> ListBox2.DragDrop 
   <FONT color=blue>Dim</FONT> LItem <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=green>' Obtain the Source ListItem String</FONT>
   LItem = e.Data.GetData(DataFormats.Text).ToString 
   <FONT color=green>' Add it to Listbox2</FONT>
   ListBox2.Items.Add(LItem) 
   <FONT color=green>' Remove the Item from Listbox1</FONT>
   ListBox1.Items.RemoveAt(ListBox1.FindString(LItem)) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE><BR>Khi Load data vào Listbox ta dùng 
    <B>StreamReader</B> để Open một File as Input.<BR>Khi Save data của Listbox 
    vào một Text file ta dùng <B>StreamWriter</B> để Open một File as Output 
    (hay Append nếu ta cho thêm Option Append=True):<BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> MenuItem2_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> MenuItem2.Click 
   <FONT color=green>' Read the list of animals from a text file into Listbox2</FONT>
   <FONT color=blue>Dim</FONT> sr <FONT color=blue>As</FONT> StreamReader 
   <FONT color=blue>Dim</FONT> Pos <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Dim</FONT> TStr <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   ListBox2.Items.Clear()  <FONT color=green>' Clear Listbox2</FONT>
   <FONT color=green>' Use a StreamReader to open the UTF-8 file to read.</FONT>
   sr = <FONT color=blue>New</FONT> StreamReader(AppPath &amp; "animals.txt") 
   <FONT color=green>' Read each line in the file.</FONT>
   <FONT color=green>' When the end of the file is reached, return the value "-1".</FONT>
   <FONT color=blue>Dim</FONT> x <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>While</FONT> sr.Peek &lt;&gt; -1 
      x = sr.ReadLine()  <FONT color=green>' Read a line</FONT>
      ListBox2.Items.Add(x)  <FONT color=green>' Add it to Listbox2</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>While</FONT> 
   sr.Close()  <FONT color=green>' Close the file</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> <BR>
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> SaveAnimalList() 
   <FONT color=green>' Save the content of Listbox2 into a UTF-8 Text file</FONT>
   <FONT color=blue>Dim</FONT> i <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Dim</FONT> sw <FONT color=blue>As</FONT> StreamWriter 
   <FONT color=green>' Open the file to write in UTF-8 mode, using a StreamWriter.</FONT>
   sw = <FONT color=blue>New</FONT> StreamWriter(AppPath &amp; "Animals.txt") 
   <FONT color=green>' Write each line in the Listbox.</FONT>
   <FONT color=blue>For</FONT> i = 0 <FONT color=blue>To</FONT> ListBox2.Items.Count - 1 
      sw.WriteLine(ListBox2.Items(i)) 
   <FONT color=blue>Next</FONT> 
   sw.Close()  <FONT color=green>' Close the file</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE><BR>Ta hiển thị ngày và giờ bằng cách 
    dùng <B>Timer1</B> và Shared Function <B>DateTime.Now</B> formated bằng hai 
    Functions có sẵn <B>ToLongDateString</B> và <B>ToLongTimeString</B>.<BR><BR>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Timer1_Tick(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> Timer1.Tick 
   <FONT color=green>' Display Date and Time every half a second</FONT>
   Label3.Text = DateTime.Now.ToLongDateString &amp; " " &amp; DateTime.Now.ToLongTimeString 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE>Bạn cũng có thể hiển thị ngày giờ 
    trong format khác bằng cách viết: 
    <BLOCKQUOTE>Label3.Text = DateTime.Now.ToString("ddd dd/MM/yyyy 
    hh:mm:ss")</BLOCKQUOTE>
    <BLOCKQUOTE>
      <BLOCKQUOTE>để có: WED 18/07/2001 09:16:42</BLOCKQUOTE></BLOCKQUOTE>Để ý 
    trong Format string ta dùng <B>MM</B> cho Month và <B>mm</B> cho 
    Minute.<BR><BR></BLOCKQUOTE>
  <P>&nbsp;</P></FONT><FONT face=Tahoma><A href="http://www.vovisoft.com/"><IMG 
  height=40 src="Bai 2_files/homejump.gif" width=40><A>&nbsp;&nbsp;<A 
  href="http://www.vovisoft.com/dotNET/default.asp">Học Microsoft 
  .NET</A><BR><BR></BLOCKQUOTE></FONT></FONT><!-- End of Cut and paste content --><!-- Start of bottom bar for copyright notice etc --><!-- End of Cut and paste content --><!-- Start of bottom bar for copyright notice etc -->
<TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
width="100%" border=0>
  <TBODY>
  <TR>
    <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
      <P align=center><FONT face=Tahoma color=#ffffff size=1>Vovisoft Â© 2000. 
      All rights reserved.</FONT></P></TD></TR>
  <TR>
    <TD width=256>
      <P align=center><FONT face=Tahoma size=1>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->12 
      Feb 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="14381" --> </FONT></P></TD>
    <TD width=181><FONT face=Tahoma size=1>&nbsp;</FONT></TD>
    <TD width=258>
      <P align=center><FONT face=Tahoma size=1><A 
      href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE><BR></BODY></HTML>
